<?php

class ApostaController extends Zend_Controller_Action
{

    public function init()
    {
    }

    public function indexAction()
    {
        $this->_helper->redirector('criar');
    }

    public function criarAction()
    {
        $valor = 500;
        $email = $this->_helper->logOn(true)->getEmail();
        $request = $this->getRequest();
        
        $bolaoMapper = new Application_Model_BolaoMapper();
        $jogoMapper = new Application_Model_JogoMapper();
        $apostaMapper = new Application_Model_ApostaMapper();
        $pendenteMapper = new Application_Model_ParticipantesBolaoMapper();
        $usuarioMapper = new Application_Model_UsuarioMapper();
        
        $id_bolao = $this->getRequest()->getParam('id_bolao');
        
        //verificacao da existencia de bolao
        $bolao_existe = $bolaoMapper->findBolao($id_bolao);
        if($bolao_existe == NULL)
        {
            $this->view->dados = 'Bolão Inexistente! Procure um bolão válido para apostar.';
            $this->view->form = NULL;
            return;
        }
        
        $id_jogo = $bolaoMapper->findBolao($id_bolao)->get_id_jogo();
        $jogo = $jogoMapper->fetch_sem_data($id_jogo);
        $data = $jogo->getData();
        
        $form = new Application_Form_CriarAposta($jogo->getTimeA(), $jogo->getTimeB());
        $form->setEdicao(false);
        $this->view->form = $form;
        $this->view->time_a = $jogo->getTimeA();
        $this->view->time_b = $jogo->getTimeB();
        $this->view->campeonato = $jogo->getCampeonatoId();
        $this->view->data = $data;
        
        //verificacao de data limite para apostas
        if($jogo->jaPassou())
        {
            $this->view->dados = 'O prazo para apostar neste bolão expirou!';
            $this->view->form = NULL;
            return;
        }
        
        $apostou = $apostaMapper->localizarApostadorBolao($email, $id_jogo, $id_bolao);
        if($apostou != NULL)
        {
            $endereco = $this->view->url(
                    array(
                        'controller' => 'aposta',
                        'action'     => 'editar',
                        'id_bolao'   => $id_bolao,
                        )
                    );
            $this->view->dados = 'Você já apostou neste bolão!<br>Pode editar sua aposta <a href="'.$endereco.'">aqui</a>';
            $this->view->form = NULL;
            return;
        }
        
        //verificacao de participacao em bolao
        $criador = $bolao_existe->get_email_criador();
        
        if($criador != null)
        {
            $resultado = $pendenteMapper->existe($id_bolao, $email);
            if(!$resultado)
            {
                $this->view->dados = 'Você não foi convidado a apostar neste bolão ou já apostou neste bolão!';
                $this->view->form = NULL;
                return;
            }
        }
        
        //verificacao da quantidade de bolitos
        $apostador = new Application_Model_Usuario(NULL, NULL, NULL, NULL, NULL, NULL, NULL);
        $usuarioMapper->find($email, $apostador);
        $bolitos = $apostador->getBolitos();
        if (($bolitos - $valor) < 0)
        {
            $this->view->dados = 'Você não tem bolitos suficientes';
            $this->view->form = NULL;
        }
        
        if ($this->getRequest()->isPost() && $form->isValid($request->getPost()))
        {
            $valores = $form->getValues();
            $dados = NULL;
            try
            {
                $dados = Application_Model_Aposta::fazerAposta($email, $id_jogo, $id_bolao, $valores['placar_parcial'], $valores['gols_time_a'], $valores['gols_time_b'], $valores['placar_final'], $valor);
                $this->view->form = NULL;
            } catch (Exception $ex) {
                if($ex->getCode() == 23000)
                {
                    $this->view->dados = 'Você já apostou nesse bolão!';
                    $this->view->form = NULL;
                    return;
                } else {
                    $this->view->dados = $ex->getMessage();
                    $this->view->form = NULL;
                    return;
                }
            }
            $this->view->dados = $dados;
        }
    }

    public function editarAction()
    {
        if ($this->getRequest()->isPost() && $this->getRequest()->getParam('remove'))
        {
            return $this->_forward('remover');
        }

        $bolaoMapper = new Application_Model_BolaoMapper();
        $jogoMapper = new Application_Model_JogoMapper();
        $apostaMapper = new Application_Model_ApostaMapper();

        $email = $this->_helper->logOn(true)->getEmail();
        $request = $this->getRequest();
        $id_bolao = $this->getRequest()->getParam('id_bolao');

        //verificacao da existencia de bolao
        $bolao_existe = $bolaoMapper->findBolao($id_bolao);
        if($bolao_existe == NULL) {
            $this->view->dados = 'Bolão Inexistente! Você só pode editar bolões válidos.';
            $this->view->form = NULL;
            return;
        }

        $id_jogo = $bolaoMapper->findBolao($id_bolao)->get_id_jogo();
        $jogo = $jogoMapper->fetch_sem_data($id_jogo);
        $data = $jogo->getData();

        $form = new Application_Form_CriarAposta($jogo->getTimeA(), $jogo->getTimeB());
        $form->setEdicao(true);
        $this->view->form = $form;
        $this->view->time_a = $jogo->getTimeA();
        $this->view->time_b = $jogo->getTimeB();
        $this->view->campeonato = $jogo->getCampeonatoId();
        $this->view->data = $data;

        //verificacao de data limite para apostas
        if($jogo->jaPassou()){
            $this->view->dados = 'O prazo para editar sua aposta neste bolão expirou!';
            $this->view->form = NULL;
            return;
        }

        $apostou = $apostaMapper->localizarApostadorBolao($email, $id_jogo, $id_bolao);
        if($apostou == NULL){
            $endereco = $this->view->url(
                        array(
                            'controller' => 'aposta',
                            'action' => 'criar',
                            'id_bolao' => $id_bolao,
                        )
                    );
            $this->view->dados = 'Você ainda não Apostou neste bolão!<br>Pode criar sua aposta <a href="'.$endereco.'">clicando aqui!</a>';
            $this->view->form = NULL;
            return;
        }

        //envio dos dados da aposta para o form
        $aposta = $apostaMapper->localizarApostadorBolao($email, $id_jogo, $id_bolao);
        $form->setCampos($aposta->getGolsTimeA(), $aposta->getGolsTimeB(), $aposta->getOrdemGols());

        if ($this->getRequest()->isPost() && $form->isValid($request->getPost()))
        {
            $valores = $form->getValues();
            $dados = NULL;
            try
            {
                $aposta->setPlacarParcial($valores['placar_parcial']);
                $aposta->setGolsTimeA($valores['gols_time_a']);
                $aposta->setGolsTimeB($valores['gols_time_b']);
                $aposta->setOrdemGols($valores['placar_final']);
                $apostaMapper->salvar($aposta);
                $dados = 'Aposta alterada com sucesso!';
                $this->view->form = $form;
            } catch (Exception $ex) {
                if($ex->getCode() == 23000)
                {
                    $this->view->dados = 'Houve um erro, desculpe.';
                    $this->view->form = $form;
                    return;
                } else {
                    $this->view->dados = $ex->getMessage();
                    $this->view->form = $form;
                    return;
                }
            }
            $this->view->dados = $dados;
        }

    }

    public function removerAction()
    {
        //$this->_helper->viewRenderer->setNoRender(true);

        $bolaoMapper = new Application_Model_BolaoMapper();
        $jogoMapper = new Application_Model_JogoMapper();
        $apostaMapper = new Application_Model_ApostaMapper();

        $email = $this->_helper->logOn(true)->getEmail();
        $request = $this->getRequest();
        $id_bolao = $request->getParam('id_bolao');

        //verificacao da existencia de bolao
        $bolao = $bolaoMapper->findBolao($id_bolao);
        if($bolao == NULL) {
            $this->view->dados = 'Bolão Inexistente! Você só pode remover apostas de bolões válidos.';
            $this->view->destruir = true;
            return;
        }

        $id_jogo = $bolao->get_id_jogo();
        $jogo = $jogoMapper->fetch_sem_data($id_jogo);

        $aposta = $apostaMapper->localizarApostadorBolao($email, $id_jogo, $id_bolao);
        if($aposta == NULL){
            $endereco = $this->view->url(
                        array(
                            'controller' => 'aposta',
                            'action' => 'criar',
                            'id_bolao' => $id_bolao,
                        )
                    );
            $this->view->dados = 'Você ainda não Apostou neste bolão!<br>Pode criar sua aposta <a href="'.$endereco.'">clicando aqui!</a>';
            return;
        }

        $apostaMapper->remover($aposta);

        $this->view->sucessoAbsoluto = true;

        //$this->_helper->redirector('index', 'index');
    }
}
